package 字符串;

/**
 * @Date 2024/9/6 23:04
 * @description: 二进制加法 (模拟)
 * .https://leetcode.cn/problems/add-binary/description/
 * @Author LittleNight
 */
public class likou67 {

    // 二进制加法就是和链表相加是一样的
    public String addBinary(String a, String b) {
        StringBuffer sb = new StringBuffer();
        int len1 = a.length(), len2 = b.length();
        // 从各位开始相加
        int i = len1 - 1, j = len2 - 1,  t = 0;
        while(i >= 0 || j >= 0 || t != 0) {
            if(i >= 0) t += (a.charAt(i--) - '0'); // 注意是减去字符 0, 不是字符a
            if(j >= 0) t += (b.charAt(j--) - '0');
            // 收集结果. 几进制就是模几 和 除以 几
            sb.append(t % 2);
            t /= 2; // 进位数
        }
        // 不要忘记翻转结果
        return sb.reverse().toString();
    }

    // 二进制加法就是模拟的过程
    // todo 错误代码
    public String addBinary2(String a, String b) {
        // 从后往前加
        StringBuffer sb = new StringBuffer();
        int n = Math.max(a.length(), b.length());
        int a1 = a.length(), b2 = b.length(), t = 0;
        // 先找到哪个是长的
        if(a.length() >= b.length()) {
            // 遍历 a
            for (int i = a1 - 1; i >= 0; i--) {
                t += (a.charAt(i) - '0');
                if(i <= b2) {
                    t += (b.charAt(i) - '0');
                }
                // 把进位上的数添加到结果中
                sb.append(t / 2);
                t %= 2;
            }
        }else {
            // 遍历 b
            for (int i = b2 - 1; i >= 0; i--) {
                t += (a.charAt(i) - '0');
                if(i <= a1) {
                    t += (a.charAt(i) - '0');
                }
                // 把进位上的数添加到结果中
                sb.append(t / 2);
                t %= 2;
            }
        }
        return sb.reverse().toString();
    }

}
